-- =====================================================
-- 技术文档管理 - 完整测试数据脚本
-- =====================================================
-- 数据库：PostgreSQL 14+
-- 用途：生成开发/测试环境的示例数据
-- 版本：v2.0 (Phase 2 完整版)
-- 日期：2025-10-26
-- =====================================================

BEGIN;

-- =====================================================
-- 1. 清空现有数据（按依赖关系倒序删除）
-- =====================================================

-- 方式1: 使用 TRUNCATE（推荐，速度快）
-- 注意：必须按依赖关系顺序删除，先删除子表，再删除父表

-- 删除审计日志（无依赖）
TRUNCATE TABLE audit_logs RESTART IDENTITY CASCADE;

-- 删除会话（依赖 users）
TRUNCATE TABLE sessions RESTART IDENTITY CASCADE;

-- 删除用户权限关联表（依赖 users 和 permissions）
TRUNCATE TABLE user_permissions RESTART IDENTITY CASCADE;

-- 删除角色权限关联表（依赖 roles 和 permissions）
TRUNCATE TABLE role_permissions RESTART IDENTITY CASCADE;

-- 删除文档（依赖 doc_categories 和 users）
TRUNCATE TABLE documents RESTART IDENTITY CASCADE;

-- 删除用户（依赖 roles）
TRUNCATE TABLE users RESTART IDENTITY CASCADE;

-- 删除权限（无依赖）
TRUNCATE TABLE permissions RESTART IDENTITY CASCADE;

-- 删除分类（无依赖，但有自引用）
TRUNCATE TABLE doc_categories RESTART IDENTITY CASCADE;

-- 删除角色（无依赖）
TRUNCATE TABLE roles RESTART IDENTITY CASCADE;

-- 方式2: 如果 TRUNCATE 失败，使用 DELETE（兜底方案）
-- 如果上面的 TRUNCATE 因为某些原因失败，可以使用下面的 DELETE
-- DELETE FROM audit_logs;
-- DELETE FROM sessions;
-- DELETE FROM user_permissions;
-- DELETE FROM role_permissions;
-- DELETE FROM documents;
-- DELETE FROM users;
-- DELETE FROM permissions;
-- DELETE FROM doc_categories;
-- DELETE FROM roles;
-- 
-- -- 重置序列
-- ALTER SEQUENCE doc_categories_id_seq RESTART WITH 1;
-- ALTER SEQUENCE roles_id_seq RESTART WITH 1;
-- ALTER SEQUENCE permissions_id_seq RESTART WITH 1;
-- ALTER SEQUENCE documents_id_seq RESTART WITH 1;

-- =====================================================
-- 2. 插入角色数据
-- =====================================================

INSERT INTO roles (id, name, display_name, description, is_system, sort_order) VALUES
(1, 'admin', '管理员', '系统管理员，拥有所有权限', true, 1),
(2, 'editor', '编辑', '可以创建和编辑文档', false, 2),
(3, 'viewer', '访客', '只能查看公开文档', false, 3),
(4, 'content_manager', '内容管理员', '负责内容审核和发布', false, 4);

-- =====================================================
-- 3. 插入权限数据
-- =====================================================

INSERT INTO permissions (name, display_name, description, resource, action, category, sort_order) VALUES
-- 文档管理
('doc:read', '查看文档', '可以查看所有已发布的文档', 'document', 'read', '文档管理', 1),
('doc:write', '编辑文档', '可以创建和编辑文档', 'document', 'write', '文档管理', 2),
('doc:delete', '删除文档', '可以删除文档', 'document', 'delete', '文档管理', 3),
('doc:publish', '发布文档', '可以发布和取消发布文档', 'document', 'publish', '文档管理', 4),

-- 分类管理
('category:manage', '管理分类', '可以创建、编辑、删除分类', 'category', 'manage', '分类管理', 5),

-- 用户管理
('user:read', '查看用户', '可以查看用户列表和详情', 'user', 'read', '用户管理', 6),
('user:create', '创建用户', '可以创建新用户', 'user', 'create', '用户管理', 7),
('user:update', '编辑用户', '可以编辑用户信息', 'user', 'update', '用户管理', 8),
('user:delete', '删除用户', '可以删除用户', 'user', 'delete', '用户管理', 9),

-- 角色管理
('role:read', '查看角色', '可以查看角色列表', 'role', 'read', '角色管理', 10),
('role:create', '创建角色', '可以创建新角色', 'role', 'create', '角色管理', 11),
('role:update', '编辑角色', '可以编辑角色信息', 'role', 'update', '角色管理', 12),
('role:delete', '删除角色', '可以删除角色', 'role', 'delete', '角色管理', 13),

-- 权限管理
('permission:read', '查看权限', '可以查看权限列表', 'permission', 'read', '权限管理', 14),
('permission:manage', '管理权限', '可以分配和撤销权限', 'permission', 'manage', '权限管理', 15),

-- 系统管理
('system:config', '系统配置', '可以修改系统配置', 'system', 'config', '系统管理', 16);

-- =====================================================
-- 4. 分配权限给角色
-- =====================================================

-- 管理员 - 所有权限
INSERT INTO role_permissions (role_id, permission_id)
SELECT 1, id FROM permissions;

-- 编辑 - 文档和分类权限
INSERT INTO role_permissions (role_id, permission_id)
SELECT 2, id FROM permissions 
WHERE name IN ('doc:read', 'doc:write', 'doc:publish', 'category:manage');

-- 内容管理员 - 文档权限 + 用户查看
INSERT INTO role_permissions (role_id, permission_id)
SELECT 4, id FROM permissions 
WHERE name IN ('doc:read', 'doc:write', 'doc:delete', 'doc:publish', 'category:manage', 'user:read');

-- 访客 - 只读权限
INSERT INTO role_permissions (role_id, permission_id)
SELECT 3, id FROM permissions 
WHERE name = 'doc:read';

-- =====================================================
-- 5. 插入测试用户
-- =====================================================

-- 注意：以下密码使用 bcrypt 加密
-- 所有用户的初始密码都是：123456
-- 实际环境中请替换为真实的 bcrypt 哈希值

INSERT INTO users (
    email, username, encrypted_password, full_name, 
    role_id, email_verified, status, email_confirmed_at
) VALUES
-- 管理员
(
    'admin@example.com',
    'admin',
    '$2a$10$igNfjydut8lPiqSGQgB.v.sDokWmO7AW20K52nbf31vI8aw94/fuC',
    '系统管理员',
    1,
    true,
    'active',
    CURRENT_TIMESTAMP
),

-- 编辑用户
(
    'editor@example.com',
    'editor1',
    '$2a$10$igNfjydut8lPiqSGQgB.v.sDokWmO7AW20K52nbf31vI8aw94/fuC',
    '张三',
    2,
    true,
    'active',
    CURRENT_TIMESTAMP
),
(
    'editor2@example.com',
    'editor2',
    '$2a$10$igNfjydut8lPiqSGQgB.v.sDokWmO7AW20K52nbf31vI8aw94/fuC',
    '李四',
    2,
    true,
    'active',
    CURRENT_TIMESTAMP
),

-- 内容管理员
(
    'content@example.com',
    'content_manager',
    '$2a$10$igNfjydut8lPiqSGQgB.v.sDokWmO7AW20K52nbf31vI8aw94/fuC',
    '王五',
    4,
    true,
    'active',
    CURRENT_TIMESTAMP
),

-- 访客用户
(
    'viewer@example.com',
    'viewer1',
    '$2a$10$igNfjydut8lPiqSGQgB.v.sDokWmO7AW20K52nbf31vI8aw94/fuC',
    '赵六',
    3,
    true,
    'active',
    CURRENT_TIMESTAMP
),

-- 未验证邮箱的用户
(
    'unverified@example.com',
    'unverified',
    '$2a$10$igNfjydut8lPiqSGQgB.v.sDokWmO7AW20K52nbf31vI8aw94/fuC',
    '测试用户',
    3,
    false,
    'active',
    NULL
);

-- =====================================================
-- 6. 插入文档分类
-- =====================================================

-- 根分类
INSERT INTO doc_categories (id, name, slug, description, icon, parent_id, sort_order) VALUES
(1, 'API 文档', 'api-docs', 'API 接口文档和开发指南', 'Code', NULL, 10),
(2, '用户手册', 'user-guide', '产品使用指南和操作手册', 'Book', NULL, 20),
(3, '开发教程', 'tutorials', '面向开发者的教程和示例', 'GraduationCap', NULL, 30),
(4, '常见问题', 'faq', '常见问题解答', 'HelpCircle', NULL, 40),
(5, '更新日志', 'changelog', '版本更新记录', 'FileText', NULL, 50);

-- 重置序列（重要！因为手动指定了 id）
SELECT setval('doc_categories_id_seq', (SELECT MAX(id) FROM doc_categories));

-- API 文档子分类
INSERT INTO doc_categories (name, slug, description, icon, parent_id, sort_order) VALUES
('REST API', 'rest-api', 'RESTful API 接口文档', 'Globe', 1, 10),
('GraphQL', 'graphql', 'GraphQL API 查询文档', 'Network', 1, 20),
('WebSocket', 'websocket', '实时通信 WebSocket API', 'Radio', 1, 30),
('认证授权', 'authentication', '用户认证和权限管理 API', 'Shield', 1, 40);

-- 用户手册子分类
INSERT INTO doc_categories (name, slug, description, icon, parent_id, sort_order) VALUES
('快速开始', 'quick-start', '快速上手指南', 'Zap', 2, 10),
('功能介绍', 'features', '产品功能详细介绍', 'Star', 2, 20),
('配置说明', 'configuration', '系统配置和设置', 'Settings', 2, 30);

-- 开发教程子分类
INSERT INTO doc_categories (name, slug, description, icon, parent_id, sort_order) VALUES
('入门教程', 'getting-started', '从零开始的入门教程', 'PlayCircle', 3, 10),
('进阶指南', 'advanced', '高级功能和最佳实践', 'TrendingUp', 3, 20);

-- =====================================================
-- 7. 插入文档数据
-- =====================================================

-- 获取第一个用户的 ID（管理员）
DO $$
DECLARE
    admin_user_id UUID;
    editor_user_id UUID;
BEGIN
    SELECT id INTO admin_user_id FROM users WHERE username = 'admin';
    SELECT id INTO editor_user_id FROM users WHERE username = 'editor1';

    -- 插入文档
    INSERT INTO documents (
        title, slug, summary, content_type, content, category_id, tags, 
        status, author_id, author_name, view_count, like_count
    ) VALUES
    
    -- REST API 文档
    (
        '快速开始',
        'rest-api-quick-start',
        '5分钟快速了解如何使用我们的 REST API',
        'direct',
        E'# 快速开始\n\n欢迎使用我们的 REST API！\n\n## 认证\n\n```bash\ncurl -H "Authorization: Bearer YOUR_API_KEY" \\\n  https://api.example.com/v1/users\n```',
        6,
        ARRAY['REST', 'API', '快速开始'],
        'published',
        admin_user_id,
        '系统管理员',
        1250,
        89
    ),
    
    (
        '用户管理 API',
        'user-management-api',
        '用户的增删改查接口文档',
        'direct',
        E'# 用户管理 API\n\n## 获取用户列表\n\n**接口**：`GET /api/v1/users`\n\n```json\n{\n  "success": true,\n  "data": [...]\n}\n```',
        6,
        ARRAY['REST', 'API', '用户管理'],
        'published',
        editor_user_id,
        '张三',
        2340,
        156
    ),
    
    -- 用户手册
    (
        '快速安装指南',
        'installation-guide',
        '10分钟完成系统安装',
        'direct',
        E'# 快速安装指南\n\n## 系统要求\n\n- Node.js 18+\n- PostgreSQL 14+\n\n## 安装步骤\n\n```bash\nnpm install\nnpm run dev\n```',
        10,
        ARRAY['安装', '快速开始'],
        'published',
        admin_user_id,
        '系统管理员',
        5620,
        234
    ),
    
    (
        '用户权限管理',
        'user-permissions',
        '如何管理用户角色和权限',
        'direct',
        E'# 用户权限管理\n\n## 角色说明\n\n| 角色 | 权限 |\n|------|------|\n| 管理员 | 全部权限 |\n| 编辑 | 文档管理 |',
        11,
        ARRAY['权限', '用户管理'],
        'published',
        admin_user_id,
        '系统管理员',
        3450,
        178
    ),
    
    -- 开发教程
    (
        'React 入门教程',
        'react-getting-started',
        '从零开始学习 React',
        'direct',
        E'# React 入门教程\n\n## 第一个组件\n\n```jsx\nfunction Button({ children }) {\n  return <button>{children}</button>;\n}\n```',
        14,
        ARRAY['React', 'JavaScript'],
        'published',
        editor_user_id,
        '张三',
        8920,
        567
    ),
    
    (
        'PostgreSQL 性能优化',
        'postgresql-optimization',
        '数据库性能优化最佳实践',
        'direct',
        E'# PostgreSQL 性能优化\n\n## 索引优化\n\n```sql\nCREATE INDEX idx_users_email ON users(email);\n```',
        14,  -- 修改：从 15 改为 14（进阶指南分类）
        ARRAY['PostgreSQL', '数据库', '性能'],
        'published',
        admin_user_id,
        '系统管理员',
        4560,
        298
    ),
    
    -- 草稿文档
    (
        '新功能预告',
        'upcoming-features-draft',
        '即将推出的新功能介绍',
        'direct',
        E'# 新功能预告\n\n（草稿中，即将发布...）',
        NULL,
        ARRAY['新功能'],
        'draft',
        editor_user_id,
        '张三',
        0,
        0
    );

END $$;

-- =====================================================
-- 8. 分配特殊权限给用户（示例）
-- =====================================================

-- 给某个编辑用户临时分配删除权限（有效期 30 天）
DO $$
DECLARE
    editor_id UUID;
    delete_perm_id INTEGER;
    admin_id UUID;
BEGIN
    SELECT id INTO editor_id FROM users WHERE username = 'editor1';
    SELECT id INTO delete_perm_id FROM permissions WHERE name = 'doc:delete';
    SELECT id INTO admin_id FROM users WHERE username = 'admin';
    
    IF editor_id IS NOT NULL AND delete_perm_id IS NOT NULL THEN
        INSERT INTO user_permissions (user_id, permission_id, granted_by, grant_reason, expires_at)
        VALUES (
            editor_id,
            delete_perm_id,
            admin_id,
            '临时授权：清理过期文档',
            CURRENT_TIMESTAMP + INTERVAL '30 days'
        );
    END IF;
END $$;

-- =====================================================
-- 9. 创建测试会话（示例）
-- =====================================================

DO $$
DECLARE
    admin_id UUID;
    editor_id UUID;
BEGIN
    SELECT id INTO admin_id FROM users WHERE username = 'admin';
    SELECT id INTO editor_id FROM users WHERE username = 'editor1';
    
    -- 管理员会话
    INSERT INTO sessions (user_id, refresh_token, user_agent, ip_address, device_type, expires_at)
    VALUES (
        admin_id,
        'admin_refresh_token_' || gen_random_uuid(),
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0',
        '192.168.1.100'::inet,
        'desktop',
        CURRENT_TIMESTAMP + INTERVAL '30 days'
    );
    
    -- 编辑会话
    INSERT INTO sessions (user_id, refresh_token, user_agent, ip_address, device_type, expires_at)
    VALUES (
        editor_id,
        'editor_refresh_token_' || gen_random_uuid(),
        'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) Safari/604.1',
        '192.168.1.101'::inet,
        'mobile',
        CURRENT_TIMESTAMP + INTERVAL '30 days'
    );
END $$;

-- =====================================================
-- 10. 创建审计日志示例
-- =====================================================

DO $$
DECLARE
    admin_id UUID;
    doc_id INTEGER;
BEGIN
    SELECT id INTO admin_id FROM users WHERE username = 'admin';
    SELECT id INTO doc_id FROM documents WHERE slug = 'rest-api-quick-start';
    
    -- 文档创建日志
    INSERT INTO audit_logs (
        user_id, user_email, user_role, action, resource_type, resource_id,
        ip_address, request_method, request_url, status, new_data
    ) VALUES (
        admin_id,
        'admin@example.com',
        'admin',
        'create',
        'document',
        doc_id::text,
        '192.168.1.100'::inet,
        'POST',
        '/api/v1/documents',
        'success',
        jsonb_build_object('title', '快速开始', 'status', 'published')
    );
    
    -- 文档更新日志
    INSERT INTO audit_logs (
        user_id, user_email, user_role, action, resource_type, resource_id,
        ip_address, request_method, request_url, status, old_data, new_data, changes
    ) VALUES (
        admin_id,
        'admin@example.com',
        'admin',
        'update',
        'document',
        doc_id::text,
        '192.168.1.100'::inet,
        'PUT',
        '/api/v1/documents/' || doc_id,
        'success',
        jsonb_build_object('view_count', 1000),
        jsonb_build_object('view_count', 1250),
        jsonb_build_object('view_count', jsonb_build_object('old', 1000, 'new', 1250))
    );
END $$;

-- =====================================================
-- 11. 更新统计信息
-- =====================================================

-- 更新分类文档数量
UPDATE doc_categories c
SET doc_count = (
    SELECT COUNT(*) 
    FROM documents d 
    WHERE d.category_id = c.id
);

-- 更新角色用户数量（roles 表没有 user_count 字段，跳过）
-- UPDATE roles r
-- SET user_count = (
--     SELECT COUNT(*)
--     FROM users u
--     WHERE u.role_id = r.id AND u.deleted_at IS NULL
-- )
-- WHERE EXISTS (
--     SELECT 1 FROM information_schema.columns 
--     WHERE table_name = 'roles' AND column_name = 'user_count'
-- );

-- =====================================================
-- 12. 验证数据
-- =====================================================

DO $$
DECLARE
    role_count INTEGER;
    user_count INTEGER;
    permission_count INTEGER;
    category_count INTEGER;
    document_count INTEGER;
    published_count INTEGER;
BEGIN
    SELECT COUNT(*) INTO role_count FROM roles;
    SELECT COUNT(*) INTO user_count FROM users WHERE deleted_at IS NULL;
    SELECT COUNT(*) INTO permission_count FROM permissions;
    SELECT COUNT(*) INTO category_count FROM doc_categories;
    SELECT COUNT(*) INTO document_count FROM documents;
    SELECT COUNT(*) INTO published_count FROM documents WHERE status = 'published';
    
    RAISE NOTICE '=================================================';
    RAISE NOTICE '完整测试数据生成完成！';
    RAISE NOTICE '=================================================';
    RAISE NOTICE '角色数量：% 个', role_count;
    RAISE NOTICE '用户数量：% 个', user_count;
    RAISE NOTICE '权限数量：% 个', permission_count;
    RAISE NOTICE '分类数量：% 个', category_count;
    RAISE NOTICE '文档总数：% 个', document_count;
    RAISE NOTICE '已发布：% 个', published_count;
    RAISE NOTICE '草稿：% 个', document_count - published_count;
    RAISE NOTICE '=================================================';
    RAISE NOTICE '测试账号：';
    RAISE NOTICE '  管理员：admin@example.com / 123456';
    RAISE NOTICE '  编辑：editor@example.com / 123456';
    RAISE NOTICE '  访客：viewer@example.com / 123456';
    RAISE NOTICE '=================================================';
END $$;

COMMIT;

-- =====================================================
-- 13. 查看数据
-- =====================================================

-- 查看所有用户及其角色
-- SELECT u.username, u.email, u.full_name, r.display_name as role
-- FROM users u
-- LEFT JOIN roles r ON u.role_id = r.id
-- WHERE u.deleted_at IS NULL
-- ORDER BY u.created_at;

-- 查看角色权限
-- SELECT r.display_name, COUNT(rp.permission_id) as permission_count
-- FROM roles r
-- LEFT JOIN role_permissions rp ON r.id = rp.role_id
-- GROUP BY r.id, r.display_name
-- ORDER BY r.sort_order;

-- 查看分类树
-- SELECT * FROM v_category_tree;

-- 查看已发布文档
-- SELECT * FROM v_published_documents LIMIT 10;

